package io.fredia.common.utils.reflect;

import java.lang.reflect.Field;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 字段反射工具
 * 
 * @author : fredia
 * @since : 2017年10月18日
 * @version : v0.0.1
 */
public class ReflectUtil {
	private static Logger logger = LoggerFactory.getLogger(ReflectUtil.class);

	/**
	 * 对象反射工具
	 * 
	 * @param obj
	 * @param field
	 * @return
	 * @author : fredia
	 * @since : 2017年10月18日
	 * @return :Object
	 */
	public static Object reflect(Object obj, String field) {
		if (obj == null) {
			return null;
		}
		// 获取对象所有字段
		Field[] fields = obj.getClass().getDeclaredFields();
		// java 类型,
		String[] types1 = { "int", "java.lang.String", "boolean", "char", "float", "double", "long", "short", "byte",
				"Date" };
		// java 包装类
		String[] types2 = { "java.lang.Integer", "java.lang.String", "java.lang.Boolean", "java.lang.Character",
				"java.lang.Float", "java.lang.Double", "java.lang.Long", "java.lang.Short", "java.lang.Byte",
				"java.util.Date" };
		// 遍历对象属性
		for (int j = 0; j < fields.length; j++) {
			fields[j].setAccessible(true);
			// 遍历字段名

			if (fields[j].getName() != null && fields[j].getName().equals(field)) {
				System.out.print(fields[j].getName() + ":");
				// 字段值
				for (int i = 0; i < types1.length; i++) {
					if (fields[j].getType().getName().equalsIgnoreCase(types1[i])
							|| fields[j].getType().getName().equalsIgnoreCase(types2[i])) {
						try {
							return fields[j].get(obj);
						} catch (Exception e) {
							e.printStackTrace();
							logger.error("字段值获取失败");
						}
					}
				}

			}
		}
		logger.error("传入参数[" + field + "]：字段无效");
		return null;
	}

}